首页
学习
活动
专区
圈层
工具
发布

NSInvocation 详解

NSInvocation 简介         在上篇文章关于消息的转发中介绍了,通过方法签名NSMethodSignature产生NSInvocation,然后配置NSInvocation...先感性的定义一个这个类,其实NSInvocation就是一个创建方法(消息),将方法具体化的一个类,NSInvocation能设置Target,参数,返回值和方法名称。...然后我们需要理性的看代码了如下: @interface NSInvocation : NSObject { @private __strong void *_frame; __strong...- (void)invoke; // target发送消息,即target执行方法 - (void)invokeWithTarget:(id)target; @end NSInvocation...NSInvocation的创建需要方法签名来创建,首先要得到方法签名。 NSMethodSignature类就不介绍了,一看便知。 1、类似performSelector,但是可以携带多个参数。

2K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS NSInvocation应用与理解 原

    但是perform相关的这些函数,有一个局限性,其参数数量不能超过2个,否则要做很麻烦的处理,与之相对,NSInvocation也是一种消息调用的方法,并且它的参数没有限制。...这两种直接调用对象消息的方法,在IOS4.0之后,大多被block结构所取代,只有在很老的兼容性系统中才会使用,简单用法总结如下: 一、初始化与调用 在官方文档中有明确说明,NSInvocation对象只能使用其类方法来初始化...它执行调用之前,需要设置两个方法:setSelector: 和setArgument:atIndex: - (void)viewDidLoad {     [super viewDidLoad];     ...:self];     //设置selecteor     [invocatin setSelector:myMethod];     //消息调用     [invocatin invoke];     ...二、NSInvocation的返回值 NSInvocation对象,是可以有返回值的,然而这个返回值,并不是其所调用函数的返回值,需要我们手动设置: - (void)viewDidLoad {

    1.4K50

    用单步异常检测OllyDbg的巧妙方法

    ,从而实现对程序的控制;另一种是内存断点,即当程序对某处内存有操作(读或写)时产生中断,这是直接利用CPU的调试寄存器DRx来完成的;还有一种不太像中断的“中断”,即单步中断,也就是说当你在调试器中选择...是80386以上的INTEL CPU中EFLAGS寄存器,其中的TF标志位表示单步中断。当TF为1时,CPU执行完一条指令后会产生单步异常,进入异常处理程序后TF自动置0。...调试器通过处理这个单步异常实现对程序的中断控制。持续地把TF置1,程序就可以每执行一句中断一次,从而实现调试器的单步跟踪功能。...这样当程序在正常条件下执行时,一旦产生单步异常就会转到我们自己写好的异常处理中继续进行而不会受到影响,如果程序被调试,而Cracker选择了按F8步过这段程序,那么这时产生的单步异常会被调试器忽略,这样那些关键的代码就得不到执行...如果用OD等调试,因为不会执行异常处理程序,结果就为2。这只是一个最简单的例子,如果我们把十分复杂的算法判断都写进单步异常处理程 序中,是不是就会让Cracker很郁闷呢?

    1.5K30

    编码篇 - NSInvocation的简单使用

    ...]; 但是我们知道,这两种方式都有各自的缺陷: 第一种的方法:无法通过方法名字符串来调用方法; 第二种方式:不能执行参数过多的方法,一般参数数量不能超过2个就很麻烦处理了。...常见方法及属性 NSInvocation其他常见方法属性 //保留参数,它会将传入的所有参数以及target都retain一遍 - (void)retainArguments // 判断参数是否存在,...@property (readonly) NSUInteger methodReturnLength; NSInvocation的使用步骤 (1).指定一个 SEL (2).根据这个 SEL 创建...NSMethodSignature (3).根据这个 NSInvocation 创建一个NSInvocation对象 (4).设置这个 invocation 的 target、selector、参数...、返回值 (5).调用NSInvocation对象的invoke方法 下面是一个具体的使用实例: NSString *methodNameStr = @"test:withArg2:"; SEL selector

    71320

    cocos2d-x 2.x版本接入bugly的总结

    (); 2、Lua Error,需要修改CCLuaEngine.cpp文件,执行lua出错时调用出错函数__G__TRACKBACK__; 3、C/C++异常; 第一个没什么好说的,自己看官方文档吧,很简单...当lua执行出错时,会调用相应的lua函数__G__TRACKBACK__,由该函数中调用bugly自己暴露出来的接口上传 ?...pLevel atIndex:4];   //                   }                       //                   [invocation invoke...            [invocation setArgument:&terminateApp atIndex:7];                         [invocation invoke...特别要注意自己使用的是libc++还是libstdc++,不同的设置需要引入不同的framework 在使用CMD + R进行调试运行时,如果遇到错误它是直接就断点了,不然触发Bugly的上传,想测试。

    1.7K00

    在 Shell 脚本中跟踪调试命令的执行

    文章目录 shell 脚本调试系列 概述 shell 跟踪执行的重要性 shell 脚本调试系列 本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的例子展示了如何在这些模式下启用...Linux 中启用 Shell 脚本的调试模式 在 Shell 脚本中执行语法检查调试模式 在 Shell 脚本中跟踪调试命令的执行 ---- 概述 shell 跟踪简单的来说就是跟踪 shell 脚本中的命令的执行...要打开 shell 跟踪,请使用 -x 调试选项。 这会让 shell 在终端上显示所有执行的命令及其参数。...,root用户的uid 为0 保存文件并执行脚本。...从上面的输出我们可以观察到,首先执行命令,然后其输出做为一个变量的值。 例如,先执行 date,其输出做为变量 DATE 的值。

    1.3K20

    FastJson1&FastJson2反序列化利用链分析

    fastjson利用链一样,之前的利用链分析的是fastjson在解析json格式的数据时,通过构造恶意的json数据来对fastjson进行攻击,期间会涉及到1.2.24-1.2.80等不同版本的绕过以及额外数据包的依赖...出错的原因 如下是我的调试过程: 这里经过了很多遍调试最终锁定的问题出现位置是badAttributeValueExpException的readobject,这时候前面的template已经处理完了...然后跟着程序执行逻辑走到getField.readFields()当中,单步进入getField.readFields() 然后走到readobject0(),单步进入该函数 在readObejct0函数当中会进行字段类型的判断...invokeReadObject->readObjectMethod.invoke->DelegatingMethodAccessorImpl.invoke->delegate.invoke->invoke0...payload1也不能执行,但是为什么可以正常执行?

    62620

    调试器第二讲,单步步入步过功能实现,以及基本的断点功能实现

    调试器第二讲,单步步入/步过功能实现,以及基本的断点功能实现 昨天,我们实现了调试器的基本框架,那么今天我们实现单步功能,还有断点功能,以及使用反汇编引擎 一丶反汇编引擎的编译,生成...配合我们昨天写的,则可以反汇编出来调试进程的代码了. 三丶汇编调用反汇编引擎API,显示调试进程的汇编代码. 在上面,我们对API有了一个认识....首先使用Read..读取.然后放到我们的数组中, 然后使用API,获取反汇编的各种信息 invoke ReadProcessMemory,g_hProcess,...) 如果是单步,我们要判断断点是我们设置的还是系统设置的. 1.判断是否使我们设置的断点 2.修改内存保护属性(注意保存旧的) 3.写入CC,(int 3断点) 4.读取内存数据 5.显示反汇编 设置单步....设置第九位为1 4.设置寄存器环境 SetThreadContext 设置单步步过异常 但步步过和单步步入一样 只不过遇到Call的时候我们要把他的下一条指令设置一个int3断点才可以.

    1.1K61

    iOS线程相关·零散知识点集合计划(更新中)

    思路2:利用 线程间通信 // 回到主线程 dispatch_async(mainQueue, ^{ // 追加在主线程中执行的任务...*inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:aSelector]];...argument1) atIndex:2]; [inv setArgument:&(argument2) atIndex:3]; [inv performSelector:@selector(invoke...GCD的四种组合比较总结 关于操作队列的比较 操作队列 区别 串行队列 顺序执行 并行队列 不顺序执行 关于执行方式的比较 执行方式 区别 同步执行 同步执行意味着不开线程 异步执行 异步执行意味着要开线程...关于组合的总结:是否开新线程的 执行方式 \ 操作队列 串行队列 并行队列 同步 不开新线程 不开新线程 异步 开一个新线程 开几个新线程 4.

    36430

    NSInvocation与ARC的恩怨

    背景 NSInvocation是iOS开发中常见的用来实现反射的方法,即通过传入方法名和参数等格式化的字符串后,即可调用指定的方法,虽然牺牲了运行性能,但是对于模块解耦确实是个杀手锏,而NSInvocation...问题 当我们需要获取NSInvocation调用方法的返回值时,会使用系统提供的- (void)getReturnValue:(id *retValue);方法,调用的代码大概如下面所示: NSMethodSignature...= [[NSObject alloc] init]; [invocation setArgument:¶m1 atIndex:2]; id resultValue; [invocation invoke...这时机智的你肯定会拿出Zombie Object工具,这工具确实很有用,很快我们就可以定位出过度释放是发生在action方法调用过程中,经过一轮查证,问题最有可能就是出现在NSInvocation调用过程中了...: id __unsafe_unretained tmpValue; [invocation invoke]; [invocation getReturnValue:&tmpValue]; id resultValue

    1.6K10

    深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用

    方法 在Java中很多方法都会调用invoke方法,很多异常的抛出多会定位到invoke方法: java.lang.NullPointerException at .........:43) at java.lang.reflect.Method.invoke(Method.java:497) invoke执行过程 invoke方法用来在运行时动态地调用某个实例的方法,实现如下...,一旦Class正确则权限检查通过;如果未通过,则创建一个缓存,中间再进行检查 如果上面所有的权限检查都未通过,将会执行更详细的检查: void slowCheckMemberAccess(Class的MethodAccessor为Java版 经由DelegatingMethodAccessorImpl.invoke() 调用到的就是Java版的实现 JVM层invoke0方法 invoke0...运用了asm动态生成字节码技术 - sun.reflect.ClassFileAssembler invoke总结 invoke方法的过程: MagicAccessorImpl: 原本Java的安全机制使得不同类之间不是任意信息都可见

    2.2K31

    迅为2K1000开发板龙芯平台Ejtag 单步调试 PMON 的汇编阶段

    迅为2K1000开发板 Ejtag调试器 在 9.6 小节中,我们在汇编节点实现了 led 闪烁的功能,如果您自己写的程序没有成功,我们该如何调 试呢?...就可以利用 Ejtag 仿真器进行单步调试。 那我们要如何进行单步调试呢?我们是不是就得先知道每一个指令对应的地址呢?这样我们才可以打断点。我们先来修改一下在 9.6 小节中的代码,我们加一个标签。...让 cpu 执行到断点出停止,如下图所示: 然后使用命令 unhb 0xffffffffbfc00d84 删除断点,这里一定要删除,不然 si 命令不能往下执行,如下图所示: 接着输入命令 si 1...执行 1 条执行,si 1 的意思就是单步执行 1 条指令,如下图所示: 此时我们可以发现 led3 已经点亮,说明我们之前写的汇编代码是没有问题的。...si 命令不能往下执行,如下图所示: 接着输入命令 si 1 条指令,如果我们写的代码没有问题,可以发现 led3 熄灭,如下图所示: 这样我们就在汇编阶段下调试完成了 led,同理,调试其他的

    74030

    Aspects– iOS的AOP面向切面编程的库

    简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原方法执行...接口概述 Aspects 给 NSObject 扩展了下面的方法: /// 为一个指定的类的某个方法执行前/替换/后,添加一段代码块.对这个类的所有对象都会起作用. /// /// @param block...代码示例 可以在调试应用时,使用Aspects动态添加日志记录功能....在返回值不为void的方法上使用 Aspects 你可以使用 NSInvocation 对象类自定义返回值: [PSPDFDrawView aspect_hookSelector:@selector...invoke]; [invocation getReturnValue:&processTouches]; if (processTouches) {

    2.2K80

    Linux内核调试技术——kprobe使用与实现(五)

    本地中断在处理kprobe期间依然被禁止,同时调用user_mode函数确保本处理函数处理的int3中断是在内核态执行流程期间被触发的(因为kprobe不会从用户态触发),这里之所以要做这么一个判断是因为同...和单步执行时会有选择的重新开启内核抢占。...接下来处理pre_handler回调函数,有注册的话就调用执行,然后调用setup_singlestep启动单步执行。在调试完成后直接返回1。...寄存器的TF(调试位)位置为1,把IF(中断屏蔽位)标志位置为0,然后把EIP指向单步执行的指令。...当单步指令执行完成后,CPU会自动产生一次调试异常(由于TF被置位)。此时,Kprobes会利用debug异常,执行post_handler()。下面来简单看一下: ?

    2.6K60

    OC 消息机制及转发

    正常情况下,对象收到一个消息调用时在其所属的类中方法列表去查找,若有(将其添加到一个缓存列表中下次进来可以直接调用)则跳转到方法实现去执行。...运行时开始处理了:把消息相关的都封装成一个NSInvocation对象传递给当前这个方法。...执行完成后,anInvocation对象 保存着执行结果、运行时系统获取结果,然后返回原始调用对象 , 完成处理。...//修改target方式1 NSString * newObject = @"a1233"; [anInvocation setTarget:newObject]; [anInvocation invoke...执行结果的返回值可通过- (void)getReturnValue:(void *)retLoc;查看; 注意: 如果就这样仅仅修改了一个操作对象(不是要转发多个对象),是不是和步骤2的寻找备援对象很像

    80230
    领券